Dentro de los siguientes escenarios identifique los posibles errores o anomalías que podrían producirse en la lógica del programa y que podrían ser modelados como excepciones:
Solución:
Excepciones Escenario 1:
Excepciones Escenario 2:
¿Qué problema encuentras en el siguiente bloque de tratamiento de excepciones?
xxxxxxxxxx91try{2 // instrucción3} catch (Exception e1) {4 // Codigo a realizar si no hay parametros5} catch (ArrayIndexOutOfBoundsException e1) {6 // Codigo a realizar si no hay parametros7} catch (NumberFormatException e2) {8 // Codigo a realizar con parametro no numerico9}Solución:
Las excepciones 2 y 3 nunca se ejecutarán, ya que la excepción general esta la primera. El orden de las excepciones es importante e influye en el tratamiento de las mismas.
Dado el siguiente fragmento de código:
xxxxxxxxxx91try {2 //teclado lee caracteres3 int numero;4 intentos++;5 numero = teclado.nextInt();6 System.out.println(“El numero introducido es: “ + numero);7} catch (InputMismatchException ex) {8 System.out.println(“No ha introducido un numero entero”);9}¿Que se imprime por pantalla el programa si se introduce por teclado la letra «a»?
No ha introducido un numero entero.
¿Qué tipo de excepciones o condiciones anómalas crees que se manejan en el siguiente fragmento de código?
xxxxxxxxxx81try{2 // Tomar parámetro y asignarlo a un double3 A[i] = a[i+1]-[i+2];4} catch (ArrayIndexOutOfBoundsException e1) {5 // Codigo a realizar si no hay parametros6} catch (NumberFormatException e2) {7 // Codigo a realizar con parametro no numerico8}Solución:
Dado el siguiente fragmento de código:
xxxxxxxxxx121public class Main {2 public static void main(String[] args) {3 try {4 String value = JOptionPane.showInputDialog(null, "Enter value:");5 int divisor = Integer.parseInt(value);6 System.out.println(3/divisor);7 } catch (NumberFormatException fe){8 } catch (ArithmeticException exc) { 9 }10 System.out.println("instrucciones después de la excepción.");11 }12}Responda a las siguientes cuestiones:
Si la variable divisor tiene un valor de 0 ¿qué tipo de excepción se lanza: NumberFormatException o ArithmeticException?
ArithmeticException
¿Y si la variable leída es un carácter alfabético?
NumberFormatException
Dados los siguientes bloques de instrucciones:
Bloque A:
xxxxxxxxxx111try{2 f();3} catch (MyEsception e) {4 e.printStackTrace();5}6
7try{8 g();9} catch (MyEsception e) {10 e.printStackTrace();11}
Bloque B:
xxxxxxxxxx61try{2 f();3 g();4} catch (MyException e){5 e.printStackTrace();6}¿Son equivalentes los bloques manejadores de eventos a y b?
No, aunque se trata de los mismos manejadores, en el bloque b no se conoce que función ha lanzado la excepción.
Dados los siguientes bloques de instrucciones:
Bloque A:
xxxxxxxxxx111try{2 f();3} catch (MyEsception e) {4 trhow e;5}6
7try{8 g();9} catch (MyEsception e) {10 e.printStackTrace();11}
Bloque B:
xxxxxxxxxx71try{2 f();3 g();4} catch (MyException e){5 e.printStackTrace();6 trhow e;7}¿Son equivalentes los bloques manejadores de eventos a y b?
No son equivalentes. La función f() en su tratamiento lanza la excepción al nivel superior, sin embargo, la función g() no lo hace.
Dada la siguiente definición de clase, defina correctamente un bloque que capture la excepción lanzada y que imprima un mensaje por pantalla que informe sobre el error.
xxxxxxxxxx121public class UseMyException {2 public static void main(String[] args) {3 int min = 10, max = 30;4 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));5 System.out.println("Input a number between " + min + " and " + max + " included");6 int value = Integer.parseInt(br.readLine());7 8 if (value < min || value > max) throw new MyException("The value is not in the allowed interval");{9 System.out.println("The value is in the allowed interval");10 }11 }12} Solución:
xxxxxxxxxx151public class UseMyException {2 public static void main(String[] args) {3 int min = 10, max = 30;4 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));5 System.out.println("Input a number between " + min + " and " + max + " included");6 int value = Integer.parseInt(br.readLine());7 8 try{9 if (value < min || value > max) throw new MyException("The value is not in the allowed interval");{10 } catch (MyException e){11 System.out.println("The value is in the allowed interval");12 } 13 }14 }15}
xxxxxxxxxx101try {2 a=0;3 a=Integer.parseInt(br.readLine();4} catch(IOException e1) {5 System.out.println(" IO error.");6} catch(NumberFormatException e2) {7 System.out.println("La cadena no contiene un número entero ");8}finally { 9 a=a+1;10}¿Cuánto vale, al terminar el programa, la variable a si por teclado se introduce 6?
El valor de a, sin ninguna excepción, será el leído por teclado más uno, luego a = 7.
¿Y si ocurre alguna excepción?
Si ocurre una excepción siempre será a = 1 porque siempre se ejecuta el bloque finally.
Dada la siguiente clase, usa un bloque manejador de eventos apropiado sabiendo que las condiciones anómalas están representadas por Excepciones en el flujo de entrada/salida (IOException) u otras en general (Exception).
xxxxxxxxxx241public class Ejercicio {2 public static void main(String[] args) {3 int n=10;4 int[] v = new int[n];5 6 try{7 FileReader f = new FileReader("dati.txt");8 BufferedReader in = new BufferedReader(f);9 int i=0;10 String linea = in.readLine(); 11 12 while (linea!=null) {13 v[i] = Integer.parseInt(linea);14 linea = in.readLine(); i++;15 } 16 } catch (IOException e){17 System.out.println(" IO error.");18 } catch (Exception e){19 e.printStackTrace();20 } finally{21 f.close(); 22 }23 }24}
El siguiente bloque manejador de excepciones:
xxxxxxxxxx61catch (IOException e) {2 // Output goes to System.err.3 e.printStackTrace();4 // Send trace to stdout.5 e.printStackTrace(System.out);6}¿Es capaz de manejar todas las excepciones de entrada/salida?
Sí, toda excepción será subtipo de IOExcepction.